package com.grandt.model.database.manager;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.grandt.model.beans.equipo.Equipo;
import com.grandt.model.beans.equipo.EquipoJugador;
import com.grandt.model.beans.jugadores.FiltroJugadores;
import com.grandt.model.beans.jugadores.Jugador;
import com.grandt.model.configuration.ConfigurationBean;
import com.grandt.model.constants.TipoJugador;
import com.grandt.model.exceptions.BuscarDatosException;
import com.grandt.model.exceptions.InsertDataException;
import com.grandt.model.exceptions.JugadoresCompletoException;
import com.grandt.model.exceptions.RemoveDataException;
import com.grandt.model.manager.ManagerEquipo;

public class DataBaseEquipo extends ManagerDataBase {

	//private DataBaseJugador	jugador;
	private DataBaseFecha	fecha;
	private ManagerEquipo   managerEquipo;
	public DataBaseEquipo(ConfigurationBean configuration,ManagerEquipo   managerEquipo) {
		super(configuration);
		this.managerEquipo = managerEquipo;
		//jugador = new DataBaseJugador(configuration);
		fecha = new DataBaseFecha(configuration);
	}
	@Override
	protected String getStrInsert() {
		String query="INSERT INTO EQUIPO(NOMBRE_EQUIPO,ID_JUGADOR,TIPO)" +
				" VALUES (?,?,?)";
		return query;
	}

	@Override
	protected void insertParameters(PreparedStatement prst,Object o) throws SQLException {
		EquipoJugador equipoJugador = (EquipoJugador)o;
		prst.setString(1, equipoJugador.getEquipo());
		prst.setObject(2, equipoJugador.getId()==null?"":equipoJugador.getId());
		prst.setObject(3, equipoJugador.getTipo()==null?"":equipoJugador.getTipo().toString());
		//prst.setString(3, equipoJugador.getApellidoJugador());
	}
	@Override
	protected List<Object> getResult(ResultSet result) {
		return null;
	}
	@Override
	protected String getStrQuery() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected void queryParameters(PreparedStatement prst, Object o) {
		// TODO Auto-generated method stub
		
	}

	public List<Jugador> getJugadores() throws BuscarDatosException {
		List<Jugador> jugadores = new LinkedList<Jugador>();
		try {

			String query = "Select * from JUGADOR ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				jugadores.add(getJugador(result));
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugadores;
	}

	private Jugador getJugador(ResultSet result) throws SQLException, BuscarDatosException {
		Jugador jugador = new Jugador();
		jugador.setNombre(result.getString("NOMBRE"));
		jugador.setApellido(result.getString("APELLIDO"));
		jugador.setId(result.getInt("ID"));
		jugador.setEquipo(result.getString("EQUIPO"));
		jugador.setPrecio(result.getInt("PRECIO"));
		jugador.setPosicion(result.getString("POSICION"));
		setPuntajes(jugador,result.getInt("ID"));
		return jugador;
	}

	private void setPuntajes(Jugador jugador, int idJugador) throws BuscarDatosException {
		Map<String, Integer> fechas = fecha.getFechas(idJugador);
		if(fechas!=null){
			jugador.setFechas(fechas);
		}		
	}

	public List<Equipo> getEquipos() throws BuscarDatosException, JugadoresCompletoException {
		List<Equipo> equipos = new LinkedList<Equipo>();
		try {

			String query = "Select * from EQUIPO ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				agregarEquipo(equipos,getEquipo(result));
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return equipos;
	}

	private void agregarEquipo(List<Equipo> equipos, Equipo equipo) {
		boolean merge=false;
		if(equipos!=null && equipo!=null ){
			for (Equipo equipoList : equipos) {
				if(equipoList.getNombre().equalsIgnoreCase(equipo.getNombre())){
					equipoList.addJugadores(equipo);
					merge=true;	
					break;
				}
			}
			if(!merge){
				equipos.add(equipo);
			}
		}
		
	}

	private Equipo getEquipo(ResultSet result) throws SQLException, BuscarDatosException, JugadoresCompletoException {
		Equipo equipo = new Equipo();
		
		equipo.setNombre(result.getString("NOMBRE_EQUIPO"));
		equipo.addJugador(managerEquipo.getJugador(result.getString("ID_JUGADOR")),getTipo(result.getString("TIPO")));
		
		return equipo;
	}

	private TipoJugador getTipo(String strTipo) {
		
		return strTipo.equals("")?null:TipoJugador.valueOf(strTipo);
	}

	public Equipo getEquipo(String nombre) throws BuscarDatosException, JugadoresCompletoException {
		Equipo equipo = null;
		try {

			String query = "Select * from EQUIPO WHERE NOMBRE_EQUIPO=?";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, nombre);
			ResultSet result = prst.executeQuery();
			if(result.next()){
				equipo = getEquipo(result);
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return equipo;
	}

	public List<Jugador> getJugadores(FiltroJugadores filtro) throws BuscarDatosException {
		List<Jugador> jugadores = new LinkedList<Jugador>();
		try {

			String query = "Select * from JUGADOR ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				jugadores.add(getJugador(result));
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return jugadores;
	}

	public List<String> getClubesDisponibles() throws BuscarDatosException {
		List<String> equipos = new LinkedList<String>();
		try {

			String query = "Select distinct EQUIPO from JUGADOR ";
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			ResultSet result = prst.executeQuery();
			while (result.next()) {
				equipos.add(result.getString("EQUIPO"));
				
			}
			prst.close();
		} catch (SQLException e) {
			throw new BuscarDatosException(e);
		}
		return equipos;
	}

	public void insert(Equipo equipo, Jugador jugador, TipoJugador tipo) throws InsertDataException {
		String query = "insert into EQUIPO values(?,?,?)";
		try {
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, equipo.getNombre());
			prst.setInt(2, jugador.getId());
			prst.setString(3, tipo.toString());
			prst.execute();
			prst.getConnection().commit();
			prst.close();
		} catch (SQLException e) {
			throw new InsertDataException(e);
		}
	}
	public void remove(Equipo equipo, Jugador jugador, TipoJugador tipo) throws RemoveDataException {
		String query = "delete from EQUIPO where NOMBRE_EQUIPO=? AND ID_JUGADOR=?";
		try {
			PreparedStatement prst;
			prst = connection.prepareStatement(query);
			prst.setString(1, equipo.getNombre());
			prst.setInt(2, jugador.getId());
			
			prst.execute();
			prst.getConnection().commit();
			prst.close();
		} catch (SQLException e) {
			throw new RemoveDataException(e);
		}
		
	}

}
